<?php
/**
 * Cache.php
 *
 * 应用程序缓存存取类.
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://momoger.com/license
 *
 * @category	App
 * @package 	App
 * @author 		Guya
 * @version    	1.0
 * @copyright  	Copyright © 2009 www.momoger.com All Rights Reserved.
 * @license    	http://momoger.com/license     New BSD License
 */

/**
 * 应用程序缓存存取类.
 *
 * @category	App
 * @package 	App
 * @copyright  	Copyright © 2009 www.momoger.com All Rights Reserved.
 * @license    	http://momoger.com/license     New BSD License
 */
class App_Cache {

	/**
	 * 系统封装的缓存对象.
	 *
	 * @var Zend_Cache_Core
	 */
	private static $cache = 0;

	/**
	 * 更加缓存ID获取缓存数据.
	 *
	 * @param string $key 缓存ID
	 * @return mixed
	 */
	public static function getCache($key) {
		if (!self::getCacheObj()) {
			return NULL;
		}
		return self::$cache->load($key);
	}

	/**
	 * 保存缓存数据
	 * 这里除了给这个缓存数据设置唯一的身份ID 以外, 还可以给该缓存数据添加 tag (也就是标签, 或者说别名).
	 * 这样这进行批量清除的时候可以非常方便的清除某一类特征的缓存数据.
	 *
	 * @param string $key 该缓存的身份ID
	 * @param mixed $data 需要缓存的数据
	 * @param array $tags 该缓存数据的 tag
	 * @param int $lifetime 特别指定缓存信息有效时间, 单位: 秒
	 * @return mixed
	 */
	public static function setCache($key, $data = '', $tags = array(), $lifetime = false) {
		if (!self::getCacheObj()) {
			return NULL;
		}
		return self::$cache->save($data, $key, $tags, $lifetime);
	}

	/**
	 * 清除一个缓存数据.
	 *
	 * @param string $key 需要清除的缓存身份ID
	 * @return null
	 */
	public static function removeCache($key) {
		if (!self::getCacheObj()) {
			return NULL;
		}
		return self::$cache->remove($key);
	}

	/**
	 * 批量清除缓存数据,
	 * $mode 的值目前只允许为 all|old|matchingTag|notMatchingTag|matchingAnyTag
	 * $tags 为数组模式参数. 数组元素值为字符串模式, eg: $tags = array('photos', 'comments');
	 *
	 * $mode值简要说明
	 * all: 无条件清除所有缓存数据, 此时不使用参数 $tags
	 * old: 清除过期的旧的缓存, 此时也不使用参数 $tags
	 * matchingTag: 只清除 $tags 里指定的缓存数据, 这里是精确匹配, $tags 里的值都属于某个缓存的tags, 这类的缓存数据会被清除.
	 * notMatchingTag: 清除缓存数据的tags都不存在的 $tags 里指定的这类缓存数据
	 * matchingAnyTag: 清除只要缓存数据tags中有 $tags 里指定的任意一个 tag 这里缓存数据.
	 *
	 * 由于 一个缓存数据除了要设置一个唯一身份ID, 或者KEY 外, 还可以给这个缓存数据添加不同的 tag 或者别名.
	 * 这样在批量清除缓存的时候就要注意条件的组合.
	 *
	 * @param string $mode 批量清除缓存模式
	 * @param array $tags 清除相关缓存相关范围限制
	 * @return boolean
	 */
	public static function cleanCache($mode = 'all', $tags = array()) {
		if (!self::getCacheObj()) {
			return NULL;
		}
		return self::$cache->clean($mode, $tags);
	}

	/**
	 * 获取缓存对象
	 *
	 * @return Zend_Cache_Core
	 */
	public static function getCacheObj() {
		if (0 === self::$cache) {
			self::$cache = Zend_Registry::get('cache');
		}
		return self::$cache;
	}
}